
#include <iostream>
#include "Scrollbar.h"
#include "../constantes.h"
#include "../parser/BuilderElementos.h"
using namespace std;

Scrollbar::Scrollbar(list<pair<string, string> >* listaParesElementos) {

	xFlechaAbajo = 37;
	xFlechaArriba = 37;
	yFlechaAbajo = 355;
	yFlechaArriba = 55;
	anchoFlechas = 17;
	altoFlechas = 15;
	anchoElementos = 50;
	altoElementos = 50;
	xElementos = 20;

	//Cargo el vector con las posiciones en y de las figuras del scrollbar
	vector<int> * unVector = new vector<int>;
	unVector->push_back(PROPORCION_PRIMERA_FIGURA_Y);
	unVector->push_back(PROPORCION_SEGUNDA_FIGURA_Y);
	unVector->push_back(PROPORCION_TERCERA_FIGURA_Y);
	unVector->push_back(PROPORCION_CUARTA_FIGURA_Y);
	unVector->push_back(PROPORCION_QUINTA_FIGURA_Y);
	this->posicionesYElementos = unVector;

	this->listaElementosDisponibles = listaParesElementos;

	this->limiteInf = 0;
	this->limiteSup = 4;
	texturaFondo = NULL;
	listaElementosDisponiblesTextures = NULL;
}

list<pair<string, SDL_Texture*> >* Scrollbar::generarTexturesElementosDisponibles(
		SDL_Renderer* renderer,
		list<pair<string, string> >* listaElementosDisponibles) {
	if (listaElementosDisponiblesTextures != NULL)
		return listaElementosDisponiblesTextures;
	list<pair<string, string> >::iterator itLista =
			listaElementosDisponibles->begin();
	pair<string, string> elementoActual;
	list<pair<string, SDL_Texture*> >* listaElementosDisponiblesTextures =
			new list<pair<string, SDL_Texture*> >();
	for (; itLista != listaElementosDisponibles->end(); ++itLista) {
		pair<string, SDL_Texture*> parTexturaActual;
		elementoActual = *itLista;

		parTexturaActual.first = elementoActual.first;
		cout << "elemento acutal first: " << elementoActual.first
				<< " y second: " << elementoActual.second << endl;
		SDL_Texture* texturaActual = IMG_LoadTexture(renderer,
				elementoActual.second.c_str());
		parTexturaActual.second = texturaActual;
		listaElementosDisponiblesTextures->push_back(parTexturaActual);
	}

	return listaElementosDisponiblesTextures;

}

Scrollbar::~Scrollbar() {
	SDL_DestroyTexture(texturaFondo);
}

int Scrollbar::dibujar(SDL_Renderer* renderer, double iDibX, double iDibY,
		double wDib, double hDib) {
	//cout << "Dibuja scrollbar con h: " << wDib << " y w:" << hDib << endl;
	//cout << "Dibuja scrollbar en x: " << iDibX << " y y:" << iDibY << endl;

	if (texturaFondo == NULL) {
		texturaFondo = IMG_LoadTexture(renderer, "img/scrollbar.png");
		if (texturaFondo == NULL) {
			std::cout << "SDL_CreateTextureFromSurface Error: "
					<< SDL_GetError() << std::endl;
			return 1;
		}
	}
	this->listaElementosDisponiblesTextures =
			this->generarTexturesElementosDisponibles(renderer,
					this->listaElementosDisponibles);
	SDL_Rect sdlRect, sdlRect2;

	sdlRect.x = iDibX;
	sdlRect.y = iDibY;
	sdlRect.w = wDib;
	sdlRect.h = hDib;
	SDL_RenderCopy(renderer, texturaFondo, NULL, &sdlRect);

	int i = 0;
	int contadorElementos = 0;
	list<pair<string, SDL_Texture*> >::iterator iteradorListaTextures =
			this->listaElementosDisponiblesTextures->begin();
	SDL_Texture* textureActual;
	while (iteradorListaTextures
			!= this->listaElementosDisponiblesTextures->end()
			&& i <= this->limiteSup) {

		if (i >= limiteInf && i <= limiteSup) {

			//Dibujo la figura dentro del scrollbar
			textureActual = (*iteradorListaTextures).second;
			sdlRect2.x = this->xElementos;
			sdlRect2.y = this->posicionesYElementos->at(contadorElementos);
			sdlRect2.w = this->anchoElementos;
			sdlRect2.h = this->altoElementos;
			SDL_RenderCopy(renderer, textureActual, NULL, &sdlRect2);
			contadorElementos++;
		}
		i++;
		iteradorListaTextures++;

	}
	return 0;
}

Elemento* Scrollbar::devolverElementosEnXeY(int xClick, int yClick) {

	int i = 0;
	int pos = 0;
	list<pair<string, string> >::iterator iteradorLista =
			this->listaElementosDisponibles->begin();
	Elemento* unElemento = NULL;
	BuilderElementos* builderElementos = BuilderElementos::obtenerInstancia();
	while (iteradorLista != listaElementosDisponibles->end() && i <= limiteSup) {

		if (i >= limiteInf && i <= limiteSup) {

			// Chequeo si hizo click en alguno de los elementos
			if ((xClick >= this->xElementos)
					&& (xClick <= this->xElementos + this->anchoElementos)
					&& (yClick >= this->posicionesYElementos->at(pos))
					&& (yClick
							<= this->posicionesYElementos->at(pos)
									+ this->altoElementos)) {
				cout << "creo elemento tipo: " << (*iteradorLista).first
						<< " path: " << (*iteradorLista).second << endl;
				unElemento = builderElementos->obtenerElemento(
						(*iteradorLista).first);
				return unElemento;
			}
			pos++;
		}
		i++;
		iteradorLista++;
	}
	return NULL;

}

Elemento* Scrollbar::devolverElementosEnXeY(int xClick, int yClick,list<ElementoDisponibleJugador*>*
		listaElementosDisponiblesJugador, list<Elemento*>* elementosJugador, int nroJugador) {

	int i = 0;
	int pos = 0;
	list<pair<string, string> >::iterator iteradorLista =
			this->listaElementosDisponibles->begin();
	Elemento* unElemento = NULL;
	BuilderElementos* builderElementos = BuilderElementos::obtenerInstancia();
	while (iteradorLista != listaElementosDisponibles->end() && i <= limiteSup) {

		if (i >= limiteInf && i <= limiteSup) {

			// Chequeo si hizo click en alguno de los elementos
			if ((xClick >= this->xElementos)
					&& (xClick <= this->xElementos + this->anchoElementos)
					&& (yClick >= this->posicionesYElementos->at(pos))
					&& (yClick
							<= this->posicionesYElementos->at(pos)
									+ this->altoElementos)) {

				// Cuento la cantidad de elementos del tipo seleccionado
				list<Elemento*>::iterator iteradorElementosJugador = elementosJugador->begin();
				int cantidadRepeticiones = 0;
				Elemento* elementoCanvasActual;

				for (; iteradorElementosJugador != elementosJugador->end(); iteradorElementosJugador++ ) {
					elementoCanvasActual = (*iteradorElementosJugador);
					int idElemento = elementoCanvasActual->getIdElemento();
					int idJugadorElemento = idElemento / 100;
					if ((*iteradorLista).first.compare(elementoCanvasActual->getTipo())==0 &&
							elementoCanvasActual->isEsFijo() == false &&
							idJugadorElemento == nroJugador){
						cantidadRepeticiones++;
					}
				}
				cout << "Cantidad repeticiones tipo: " << (*iteradorLista).first << " : " <<
						cantidadRepeticiones << endl;

				// Cuento la cantidad de elementos posibles para agregar al canvas del tipo seleccionado
				list<ElementoDisponibleJugador*>::iterator iteradorElementosDisponiblesJugador =
						listaElementosDisponiblesJugador->begin();
				int cantidadRepeticionesJugador = 0;
				for (; iteradorElementosDisponiblesJugador != listaElementosDisponiblesJugador->end(); iteradorElementosDisponiblesJugador++ ) {
					if ((*iteradorLista).first.compare((*iteradorElementosDisponiblesJugador)->getTipo())==0){
						cantidadRepeticionesJugador = (*iteradorElementosDisponiblesJugador)->getCantidadDisponible();
					}
				}

				cout << "Cantidad disponibles tipo: " << (*iteradorLista).first << " : " <<
						cantidadRepeticionesJugador << endl;

				if (cantidadRepeticiones < cantidadRepeticionesJugador) {
					cout << "creo elemento tipo: " << (*iteradorLista).first
							<< " path: " << (*iteradorLista).second << endl;
					unElemento = builderElementos->obtenerElemento((*iteradorLista).first);
					return unElemento;
				}
			}
			pos++;
		}
		i++;
		iteradorLista++;
	}
	return NULL;

}

vector<int>* Scrollbar::getPosicionesYElementos() {
	return this->posicionesYElementos;
}

list<pair<string, string> >* Scrollbar::getListaElementosDisponibles() {
	return this->listaElementosDisponibles;
}

int Scrollbar::getLimiteInf() {
	return this->limiteInf;
}

int Scrollbar::getLimiteSup() {
	return this->limiteSup;
}

void Scrollbar::setLimiteInf(int limite) {
	this->limiteInf = limite;
}

void Scrollbar::setLimiteSup(int limite) {
	this->limiteSup = limite;
}
